import json
import os
import requests
from io import StringIO


def format_response(data: str) -> str:
    # 转换转义字符
    converted = data.replace(r'\n', '\n').replace(r'\t', '\t')
    # 自动对齐处理
    buf = StringIO()
    for line in converted.split('\n'):
        if '\t' in line:
            # 按制表符对齐（每列最小宽度15）
            cols = [ f"{col:<15}" for col in line.split('\t') ]
            buf.write(''.join(cols) + '\n')
        else:
            buf.write(line + '\n')
    return buf.getvalue()


# todo  1、文件数据存储redis化
if __name__ == '__main__':
    host = '10.12.28.253'
    currentpath = os.path.dirname(os.path.abspath(__file__))
    # 需求表excel路径
    yan_filepath = os.path.join(currentpath, 'dataneed', '【PG】【压力测试】服务器压测工具验收报告_20250227.xlsx')
    # 协议统计日志路径
    summarpro_path = os.path.join(currentpath, 'tempbot', '组队.csv')

    # ①覆盖协议及任务
    procover_dict = {
        # 需求表路径及参数
        'yan_filepath': yan_filepath,
        "yan_pro_sheet": "协议覆盖",
        "model_cl": "所属模块",
        "proto_cl": "关联协议",
        "feature_mix": False,
        "feature_test": "组队",
        "csv_write": True,
        # 日志表路径及参数
        'log_filepath': summarpro_path,
        "log_pro_cl": "ActionName",
        "log_total": "Total",
        'locustpro': False,  # locust专加，locust需多加需求表sheet:task覆盖  列名 ：task任务列

    }
    url = f'http://{host}:8000/log_protocols'
    data = procover_dict
    # ②错误码统计
    logercode_dict = {
        # 需求表路径及参数
        'yan_filepath': yan_filepath,
        'yan_err_sheet': '错误码',  # 错误码sheet表名
        'errcode_cl': '错误码id',  # 错误码id列名
        'detail_cl': '错误码描述',  # 错误码描述列名
        'csv_write': False,  # 是否将匹配结果写入csv日志
        # 日志表目录或文件及参数
        'log_file_path': os.path.join(currentpath, 'tempbot', 'xylocuLogs'),
        # 错误码文件或目录路径
        'regex': r'.*(messageId):\s*(\d+)',  # 西游 匹配规则
    }

    # url = f'http://{host}:8000/log_errcodes'
    # data = logercode_dict

    # # ③权重验收
    # # 需求表excel路径
    yan_filepath = os.path.join(currentpath, 'dataneed', '【LD】压测工具验收报告_20241224.xlsx')
    # 协议统计日志路径
    summarpro_path = os.path.join(currentpath, 'tempbot', 'record_20250110184518.csv')
    weight_dict = {
        # 需求表路径及参数
        # 混压列表及参数
        'yan_filepath': yan_filepath,
        'weight_sheet': '混压列表',  # 混压权重配置表
        'weight_model': '功能模块',  # 功能模块列名
        'weight_num': '混压权重',  # 功能模块列名

        # 协议覆盖表及参数
        'yan_pro_sheet': '协议覆盖',  # 协议覆盖sheet表名
        'model_cl': '所属模块',  # 功能模块列名
        'proto_cl': '协议号',  # 对应协议列名

        # 日志表路径及参数
        'log_filepath': summarpro_path,
        'log_pro_cl': '消息ID',  # 日志协议列名
        'log_total': '999999',  # 汇总行名,需要在协议列除去
        'pro_sum': '请求数量',  # 日志协议请求数量列名
        'csv_write': False,  # 是否将匹配结果写入csv日志
    }
    # url = f'http://{host}:8000/feature_weight'
    # data = weight_dict

    # 统计结果
    problem_dict = {
        # 日志表路径及参数
        'log_filepath': summarpro_path,
        'log_pro_cl': 'Name',  # 日志协议列名
        'log_total': 'Total',  # 汇总行名,需要在协议列除去
        'pro_success': 'Success',  # 成功率列名
        'pro_tps': 'TPM',  # tps列名,或tpm
        'pro_max': 'Max',  # 最大响应列名
        'pro_avg': 'Avg',  # 平均响应列名
        'pro_90th': 'Avg90',  # 成功率列名
        'csv_write': False,  # 是否将匹配结果写入csv日志
        'locustpro': False,
    }
    # url = f'http://{host}:8000/stats_problem'
    # data = problem_dict

    # # 执行命令
    job_log_cmd = """
            echo "`eval $NOW` job_log"
            cd /data/lserver/log
            echo "机器人是否全登录"
            cat robot.log |grep '已全部'|head -1
            echo "错误码"
        """
    # # job_log_cmd = 'ipconfig'
    # url = f'http://{host}:8000/run_command'
    # data = {'cmd':job_log_cmd}
    #
    # 改配置
    config_dict = {
        'filepath': os.path.join(currentpath, 'dataneed', 'bot', 'config.xml'),
        'old_content_regex': r'(<uuidPrefix>)[^<]*(</uuidPrefix>)',
        'new_content': r'\g<1>bot88\g<2>',
    }
    # url = f'http://{host}:8000/modify_file_content'
    # data = config_dict
    headers = {'User-Agent': 'Mozilla/5.0', 'Content-Type': 'application/json'}  # 请求头信息
    response = requests.post(url=url, headers=headers, json=data)
    print('运行')
    if response.status_code == 200:
        result_dict = response.json() [ 'data' ]
        print(format_response(result_dict [ 'output_last' ]))
    else:
        print('HTTP Error:', response.status_code)

    # # 查看及下载文件
    # url = f'http://{host}:8000/catfile'
    # params = {
    #     'file_path': os.path.join(currentpath, 'Logs','misspro_20250212111808.csv'),
    #     'download': False
    # }
    #
    # headers = {'User-Agent': 'Mozilla/5.0', 'Content-Type': 'application/json'}
    #
    # response = requests.get(url, params=params, headers=headers)
    #
    # if response.status_code == 200:
    #     if 'text/csv' in response.headers [ 'Content-Type' ]:
    #         disposition = response.headers.get('Content-Disposition')
    #         if disposition:
    #             filename = disposition.split('filename=') [ 1 ].strip('"')
    #         else:
    #             filename = 'downloaded_file.csv'
    #         with open(filename, 'wb') as f:
    #             f.write(response.content)
    #     else:
    #         print(response.text)
    # else:
    #     print(f"Error: {response.status_code}")
